iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0

嗨,終於第十七天了,這次來介紹一下async & await

希望可以利用我目前所理解的,幫助你們能夠有初步的了解

一樣先給我目前理解的懶人包

我們都知道node.js是一個非同步的語言

所以為了解決執行順序的問題,又能控制先後順序,所以透過

async & await 達到 用同步執行順序,達到異步效果

快速初步了解一下吧~

function fn() {
  setTimeout(() => {
    console.log("異步!");
  }, 2000);
  console.log('我會先出來');
}
fn();

我們能預期到,如果在正常使用下,他的出現順序會是

在一些異步的動作中,他會放在後面才被執行。

那我們可以透過async await 來掌控他,達到同步的順序,異步的執行

  1. await 後面接受的是一個promise物件,所以我們等等直接new一個promise物件把 setTimeout包起來
  2. 他必須直接在async function裏面

上code

async function fn() {
  let promise = new Promise((resolve, reject) => {
    setTimeout(() => resolve("不在是異步了,我會先執行!"), 2000)
  });
  let res = await promise; 
  console.log(res); 
  console.log('沒辦法先出來了,我要等上面先出來');
}
fn();
//輸出結果
//等兩秒
//不在是異步了,我會先執行! 
//沒辦法先出來了,我要等上面先出來

ok感覺我們已經稍微了解異步的美好了,這邊就有點像PHP由上往下執行了

但還有一個要注意的點,如果我們的狀態是reject呢?

async function fn() {
  let promise = new Promise((resolve, reject) => {
    setTimeout(() => reject("不在是異步了,我會先執行!"), 2000)
  });
  let res = await promise; 
  console.log(res); 
  console.log('沒辦法先出來了,我要等上面先出來');
}
fn();

你會發現,等了兩秒鐘之後會噴錯~

這是因為await promise被拒絕之後,他沒辦法印出來,你必須用try catch把它包裝起來

所以我們必須補上try catch

async function fn() {
  //用Promise包裝setTimeout
  let promise = new Promise((resolve, reject) => {
    setTimeout(() => reject("這是拒絕結果,會被catach補抓"), 2000)
  });

  try {
    let res = await promise; 
    console.log(res); 
    console.log('因為拒絕了,所以這條不會印出來');
  } catch (error) {
    console.error("reject拒絕在這裡被捕捉:", error);
  }
}
fn();

這樣不管結果是resolve 或者是 reject 都沒問題囉

其實還有很多小細節我自己也還在摸索,不過目前大致上用法應該就這樣拉~~
希望這些例子可以幫助到你~


上一篇
第十六天 router.use 跟 app.use 對於中間件 簡易介紹
下一篇
第十八天 介紹一下好用的array method
系列文
Node.js隨手札記 想到什麼就說什麼的30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言